﻿/////////////////////////////////////////////////
//文件名:Fragment
//描  述:
//创建者:刘凡平(Iveely Liu)
//邮  箱:945222889@qq.com
//组  织:Iveely
//年  份:2012/5/10 13:29:54
///////////////////////////////////////////////


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IveelySE.BigData.MasterNode;
using IveelySE.BigData.Common;
using System.Runtime.InteropServices;
using System.IO;

namespace IveelySE.BigData.StoreNode
{
    /// <summary>
    /// 文件片段
    /// </summary>
    [Serializable]
    public class Fragment
    {
        /// <summary>
        /// 片段最大存放大小
        /// </summary>
        //private const int MaxSize = 64 * 1024;// * 1024;

        /// <summary>
        /// 文件片段编号
        /// </summary>
        public string Id { get; set; }

        /// <summary>
        /// 文件对应的Hash编码（用于验证）
        /// </summary>
        public int Hash { get; set; }

        /// <summary>
        /// 片段大小
        /// </summary>
        public int Size { get; set; }

        /// <summary>
        /// 片段容量
        /// </summary>
        public int MaxCount = 100;

        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CreateTime { get; set; }

        private List<int> List = new List<int>();

        /// <summary>
        /// 构造方法
        /// （实现在数据结点端，建立片段文件）
        /// </summary>
        public Fragment(string id)
        {
            this.Id = id;
          //  LocalFile.CreateFile(id);
             this.Size = 0;
        }

        /// <summary>
        /// 插入数据
        /// </summary>
        /// <param name="data">数据字符串数组</param>
        /// <returns>返回是否插入成功True为插入成功，Flase为插入失败</returns>
        public bool Add(PObject data, int size)
        {

            //计算数据大小
            this.Size += size;
            //如果当前片段大于64M则不能再添加
            if (this.MaxCount-1 <this.List.Count)
            {
                //返回不能添加
                return false;
            }
            //如果当前可以插入
            else
            {
                //将编号写入到集合中
                List.Add(data.Id);
                //将数据写入文件中

                List<PObject> inFile;
                if (File.Exists("root\\" + this.Id.ToString()))
                {
                    inFile = (List<PObject>)Common.Serialize.UnSerailzable("root\\"+this.Id.ToString());
                }
                else
                {
                    inFile = new List<PObject>();
                }
                inFile.Add(data);
                Common.Serialize.Serailzable(inFile, "root\\"+this.Id.ToString());
            }
            return true;
        }

        /// <summary>
        /// 查找对应的数据
        /// </summary>
        /// <param name="num">在片段中的行号</param>
        /// <returns>返回该对象</returns>
        public PObject Find(int num)
        {
             //获取数据编号
             int dataId=this.List[num];
             
             List<PObject> inFile = new List<PObject>();
             if (File.Exists("root\\" + this.Id.ToString()))
             {
                 inFile = (List<PObject>)Common.Serialize.UnSerailzable("root\\"+this.Id.ToString());
             }
             foreach (PObject obj in inFile)
             {
                 if (obj.Id == dataId)
                 {
                     return obj;
                 }
             }
             return null;
        }
    }
}
